home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 7 / PC World Interactive 7.iso / program / pastutor.EXE / tutor12.pas < prev   
Pascal/Delphi Source File  |  1998-04-02  |  13KB  |  516 lines

  1. {************************************************}
  2. {                                                }
  3. {   Turbo Vision 2.0 Demo                        }
  4. {   Copyright (c) 1992 by Borland International  }
  5. {                                                }
  6. {************************************************}
  7.  
  8. program Tutor12;
  9.  
  10. uses Memory, TutConst, Drivers, Objects, Views, Menus, App, Dialogs,
  11.   Editors, StdDlg, Validate, Count;
  12.  
  13. type
  14.   POrder = ^TOrder;
  15.   TOrder = record
  16.     OrderNum: string[8];
  17.     OrderDate: string[8];
  18.     StockNum: string[8];
  19.     Quantity: string[5];
  20.     Payment, Received, MemoLen: Word;
  21.     MemoText: array[0..255] of Char;
  22.   end;
  23.  
  24.   POrderObj = ^TOrderObj;
  25.   TOrderObj = object(TObject)
  26.     TransferRecord: TOrder;
  27.     constructor Load(var S: TStream);
  28.     procedure Store(var S: TStream);
  29.   end;
  30.  
  31.   POrderWindow = ^TOrderWindow;
  32.   TOrderWindow = object(TDialog)
  33.     Counter: PCountView;
  34.     constructor Init;
  35.     constructor Load(var S: TStream);
  36.     destructor Done; virtual;
  37.     procedure HandleEvent(var Event: TEvent); virtual;
  38.     procedure Store(var S: TStream); virtual;
  39.   end;
  40.  
  41.   TTutorApp = object(TApplication)
  42.     ClipboardWindow: PEditWindow;
  43.     OrderWindow: POrderWindow;
  44.     constructor Init;
  45.     destructor Done; virtual;
  46.     procedure CancelOrder;
  47.     procedure DoAboutBox;
  48.     procedure EnterNewOrder;
  49.     procedure HandleEvent(var Event: TEvent); virtual;
  50.     procedure InitMenuBar; virtual;
  51.     procedure InitStatusLine; virtual;
  52.     procedure LoadDesktop;
  53.     procedure NewWindow;
  54.     procedure OpenOrderWindow;
  55.     procedure OpenWindow;
  56.     procedure SaveDesktop;
  57.     procedure SaveOrderData;
  58.     procedure ShowOrder(AOrderNum: Integer);
  59.   end;
  60.  
  61. var
  62.   ResFile: TResourceFile;
  63.   OrderInfo: TOrder;
  64.   OrderColl: PCollection;
  65.   CurrentOrder: Integer;
  66.   TempOrder: POrderObj;
  67.  
  68. const
  69.   ROrderObj: TStreamRec = (
  70.      ObjType: 15000;
  71.      VmtLink: Ofs(TypeOf(TOrderObj)^);
  72.      Load:    @TOrderObj.Load;
  73.      Store:   @TOrderObj.Store
  74.   );
  75.   ROrderWindow: TStreamRec = (
  76.      ObjType: 15001;
  77.      VmtLink: Ofs(TypeOf(TOrderWindow)^);
  78.      Load:    @TOrderWindow.Load;
  79.      Store:   @TOrderWindow.Store
  80.   );
  81.  
  82. procedure TutorStreamError(var S: TStream); far;
  83. var
  84.   ErrorMessage: String;
  85. begin
  86.   case S.Status of
  87.     stError: ErrorMessage := 'Stream access error';
  88.     stInitError: ErrorMessage := 'Cannot initialize stream';
  89.     stReadError: ErrorMessage := 'Read beyond end of stream';
  90.     stWriteError: ErrorMessage := 'Cannot expand stream';
  91.     stGetError: ErrorMessage := 'Unregistered type read from stream';
  92.     stPutError: ErrorMessage := 'Unregistered type written to stream';
  93.     end;
  94.   DoneVideo;
  95.   PrintStr('Error: ' + ErrorMessage);
  96.   Halt(Abs(S.Status));
  97. end;
  98.  
  99. procedure LoadOrders;
  100. var
  101.   OrderFile: TBufStream;
  102. begin
  103.   OrderFile.Init('ORDERS.DAT', stOpenRead, 1024);
  104.   OrderColl := PCollection(OrderFile.Get);
  105.   OrderFile.Done;
  106. end;
  107.  
  108. procedure SaveOrders;
  109. var
  110.   OrderFile: TBufStream;
  111. begin
  112.   OrderFile.Init('ORDERS.DAT', stOpenWrite, 1024);
  113.   OrderFile.Put(OrderColl);
  114.   OrderFile.Done;
  115. end;
  116.  
  117. constructor TOrderObj.Load(var S: TStream);
  118. begin
  119.   inherited Init;
  120.   S.Read(TransferRecord, SizeOf(TransferRecord));
  121. end;
  122.  
  123. procedure TOrderObj.Store(var S: TStream);
  124. begin
  125.   S.Write(TransferRecord, SizeOf(TransferRecord));
  126. end;
  127.  
  128. constructor TOrderWindow.Init;
  129. var
  130.   R: TRect;
  131.   Field: PInputLine;
  132.   Cluster: PCluster;
  133.   Memo: PMemo;
  134. begin
  135.   R.Assign(0, 0, 60, 17);
  136.   inherited Init(R, 'Orders');
  137.   Options := Options or ofCentered;
  138.   HelpCtx := $F000;
  139.  
  140.   R.Assign(13, 2, 23, 3);
  141.   Field := New(PInputLine, Init(R, 8));
  142.   Field^.SetValidator(New(PRangeValidator, Init(1, 99999)));
  143.   Insert(Field);
  144.   R.Assign(2, 2, 12, 3);
  145.   Insert(New(PLabel, Init(R, '~O~rder #:', Field)));
  146.  
  147.   R.Assign(43, 2, 53, 3);
  148.   Field := New(PInputLine, Init(R, 8));
  149.   Field^.SetValidator(New(PPXPictureValidator,
  150.     Init('{#[#]}/{#[#]}/{##[##]}', True)));
  151.   Insert(Field);
  152.   R.Assign(26, 2, 41, 3);
  153.   Insert(New(PLabel, Init(R, '~D~ate of order:', Field)));
  154.  
  155.   R.Assign(13, 4, 23, 5);
  156.   Field := New(PInputLine, Init(R, 8));
  157.   Field^.SetValidator(New(PPXPictureValidator, Init('&&&-####', True)));
  158.   Insert(Field);
  159.   R.Assign(2, 4, 12, 5);
  160.   Insert(New(PLabel, Init(R, '~S~tock #:', Field)));
  161.  
  162.   R.Assign(46, 4, 53, 5);
  163.   Field := New(PInputLine, Init(R, 5));
  164.   Field^.SetValidator(New(PRangeValidator, Init(1, 99999)));
  165.   Insert(Field);
  166.   R.Assign(26, 4, 44, 5);
  167.   Insert(New(PLabel, Init(R, '~Q~uantity ordered:', Field)));
  168.  
  169.   R.Assign(3, 7, 57, 8);
  170.   Cluster := New(PRadioButtons, Init(R,
  171.     NewSItem('Cash   ',
  172.     NewSItem('Check  ',
  173.     NewSItem('P.O.   ',
  174.     NewSItem('Account', nil))))));
  175.   Insert(Cluster);
  176.   R.Assign(2, 6, 21, 7);
  177.   Insert(New(PLabel, Init(R, '~P~ayment method:', Cluster)));
  178.  
  179.   R.Assign(22, 8, 37, 9);
  180.   Cluster := New(PCheckBoxes, Init(R, NewSItem('~R~eceived', nil)));
  181.   Insert(Cluster);
  182.  
  183.   R.Assign(3, 10, 57, 13);
  184.   Memo := New(PMemo, Init(R, nil, nil, nil, 255));
  185.   Insert(Memo);
  186.   R.Assign(2, 9, 9, 10);
  187.   Insert(New(PLabel, Init(R, 'Notes:', Memo)));
  188.  
  189.   R.Assign(2, 14, 12, 16);
  190.   Insert(New(PButton, Init(R, '~N~ew', cmOrderNew, bfNormal)));
  191.   R.Assign(13, 14, 23, 16);
  192.   Insert(New(PButton, Init(R, '~S~ave', cmOrderSave, bfDefault)));
  193.   R.Assign(24, 14, 34, 16);
  194.   Insert(New(PButton, Init(R, 'Re~v~ert', cmOrderCancel, bfNormal)));
  195.   R.Assign(35, 14, 45, 16);
  196.   Insert(New(PButton, Init(R, 'Next', cmOrderNext, bfNormal)));
  197.   R.Assign(46, 14, 56, 16);
  198.   Insert(New(PButton, Init(R, 'Prev', cmOrderPrev, bfNormal)));
  199.  
  200.   R.Assign(5, 16, 20, 17);
  201.   Counter := New(PCountView, Init(R));
  202.   Counter^.SetCount(OrderColl^.Count);
  203.   Insert(Counter);
  204.  
  205.   SelectNext(False);
  206. end;
  207.  
  208. constructor TOrderWindow.Load(var S: TStream);
  209. begin
  210.   inherited Load(S);
  211.   GetSubViewPtr(S, Counter);
  212. end;
  213.  
  214. destructor TOrderWindow.Done;
  215. begin
  216.   DisableCommands([cmOrderNext, cmOrderPrev, cmOrderSave]);
  217.   inherited Done;
  218. end;
  219.  
  220. procedure TOrderWindow.HandleEvent(var Event: TEvent);
  221. begin
  222.   inherited HandleEvent(Event);
  223.   if (Event.What = evBroadcast) and
  224.     (Event.Command = cmFindOrderWindow) then
  225.     ClearEvent(Event);
  226. end;
  227.  
  228. procedure TOrderWindow.Store(var S: TStream);
  229. begin
  230.   inherited Store(S);
  231.   PutSubViewPtr(S, Counter);
  232. end;
  233.  
  234. constructor TTutorApp.Init;
  235. var
  236.   R: TRect;
  237. begin
  238.   MaxHeapSize := 8192;
  239.   EditorDialog := StdEditorDialog;
  240.   StreamError := @TutorStreamError;
  241.   RegisterMenus;
  242.   RegisterObjects;
  243.   RegisterViews;
  244.   RegisterApp;
  245.   RegisterEditors;
  246.   RegisterDialogs;
  247.   RegisterValidate;
  248.   RegisterType(ROrderObj);
  249.   RegisterType(ROrderWindow);
  250.   RegisterCount;
  251.   ResFile.Init(New(PBufStream, Init('TUTORIAL.TVR', stOpenRead, 1024)));
  252.   inherited Init;
  253.   DisableCommands([cmStockWin, cmSupplierWin]);
  254.   Desktop^.GetExtent(R);
  255.   ClipboardWindow := New(PEditWindow, Init(R, '', wnNoNumber));
  256.   if ValidView(ClipboardWindow) <> nil then
  257.   begin
  258.     ClipboardWindow^.Hide;
  259.     InsertWindow(ClipboardWindow);
  260.     Clipboard := ClipboardWindow^.Editor;
  261.     Clipboard^.CanUndo := False;
  262.   end;
  263.   LoadOrders;
  264.   CurrentOrder := 0;
  265.   OrderInfo := POrderObj(OrderColl^.At(CurrentOrder))^.TransferRecord;
  266.   DisableCommands([cmOrderNext, cmOrderPrev, cmOrderCancel, cmOrderSave]);
  267. end;
  268.  
  269. destructor TTutorApp.Done;
  270. begin
  271.   ResFile.Done;
  272.   inherited Done;
  273. end;
  274.  
  275. procedure TTutorApp.CancelOrder;
  276. begin
  277.   if CurrentOrder < OrderColl^.Count then
  278.     ShowOrder(CurrentOrder)
  279.   else
  280.   begin
  281.     Dispose(TempOrder, Done);
  282.     ShowOrder(CurrentOrder - 1);
  283.   end;
  284. end;
  285.  
  286. procedure TTutorApp.DoAboutBox;
  287. begin
  288.   ExecuteDialog(PDialog(ResFile.Get('ABOUTBOX')), nil);
  289. end;
  290.  
  291. procedure TTutorApp.EnterNewOrder;
  292. begin
  293.   OpenOrderWindow;
  294.   CurrentOrder := OrderColl^.Count;
  295.   TempOrder := New(POrderObj, Init);
  296.   OrderInfo := TempOrder^.TransferRecord;
  297.   with OrderWindow^ do
  298.   begin
  299.     SetData(OrderInfo);
  300.     Counter^.SetCurrent(CurrentOrder + 1);
  301.   end;
  302.   DisableCommands([cmOrderNext, cmOrderPrev, cmOrderNew]);
  303.   EnableCommands([cmOrderCancel, cmOrderSave]);
  304. end;
  305.  
  306. procedure TTutorApp.HandleEvent(var Event: TEvent);
  307. var
  308.   R: TRect;
  309. begin
  310.   inherited HandleEvent(Event);
  311.   if Event.What = evCommand then
  312.   begin
  313.     case Event.Command of
  314.       cmOrderNew:
  315.         begin
  316.           EnterNewOrder;
  317.           ClearEvent(Event);
  318.         end;
  319.       cmOrderCancel:
  320.         begin
  321.           CancelOrder;
  322.           ClearEvent(Event);
  323.         end;
  324.       cmOrderNext:
  325.         begin
  326.           ShowOrder(CurrentOrder + 1);
  327.           ClearEvent(Event);
  328.         end;
  329.       cmOrderPrev:
  330.         begin
  331.           ShowOrder(CurrentOrder - 1);
  332.           ClearEvent(Event);
  333.         end;
  334.       cmOrderSave:
  335.         begin
  336.           SaveOrderData;
  337.           ClearEvent(Event);
  338.         end;
  339.       cmOrderWin:
  340.         begin
  341.           OpenOrderWindow;
  342.           ClearEvent(Event);
  343.         end;
  344.       cmOptionsLoad:
  345.         begin
  346.           LoadDesktop;
  347.           ClearEvent(Event);
  348.         end;
  349.       cmOptionsSave:
  350.         begin
  351.           SaveDesktop;
  352.           ClearEvent(Event);
  353.         end;
  354.       cmClipShow:
  355.         with ClipboardWindow^ do
  356.         begin
  357.           Select;
  358.           Show;
  359.           ClearEvent(Event);
  360.         end;
  361.       cmNew:
  362.         begin
  363.           NewWindow;
  364.           ClearEvent(Event);
  365.         end;
  366.       cmOpen:
  367.         begin
  368.           OpenWindow;
  369.           ClearEvent(Event);
  370.         end;
  371.       cmOptionsVideo:
  372.         begin
  373.           SetScreenMode(ScreenMode xor smFont8x8);
  374.           ClearEvent(Event);
  375.         end;
  376.       cmAbout:
  377.         begin
  378.           DoAboutBox;
  379.           ClearEvent(Event);
  380.         end;
  381.     end;
  382.   end;
  383. end;
  384.  
  385. procedure TTutorApp.InitMenuBar;
  386. begin
  387.   MenuBar := PMenuBar(ResFile.Get('MAINMENU'));
  388. end;
  389.  
  390. procedure TTutorApp.InitStatusLine;
  391. var
  392.   R: TRect;
  393. begin
  394.   StatusLine := PStatusLine(ResFile.Get('STATUS'));
  395.   GetExtent(R);
  396.   StatusLine^.MoveTo(0, R.B.Y - 1);
  397. end;
  398.  
  399. procedure TTutorApp.LoadDesktop;
  400. var
  401.   DesktopFile: TBufStream;
  402.   TempDesktop: PDesktop;
  403.   R: TRect;
  404. begin
  405.   DesktopFile.Init('DESKTOP.TUT', stOpenRead, 1024);
  406.   TempDesktop := PDesktop(DesktopFile.Get);
  407.   DesktopFile.Done;
  408.   if ValidView(TempDesktop) <> nil then
  409.   begin
  410.     Desktop^.Delete(ClipboardWindow);
  411.     Delete(Desktop);
  412.     Dispose(Desktop, Done);
  413.     Desktop := TempDesktop;
  414.     Insert(Desktop);
  415.     GetExtent(R);
  416.     R.Grow(0, -1);
  417.     Desktop^.Locate(R);
  418.     InsertWindow(ClipboardWindow);
  419.     OrderWindow := Message(Desktop, evBroadcast, cmFindOrderWindow, nil);
  420.     if OrderWindow <> nil then ShowOrder(CurrentOrder);
  421.   end;
  422. end;
  423.  
  424. procedure TTutorApp.NewWindow;
  425. var
  426.   R: TRect;
  427.   TheWindow: PEditWindow;
  428. begin
  429.   R.Assign(0, 0, 60, 20);
  430.   TheWindow := New(PEditWindow, Init(R, '', wnNoNumber));
  431.   InsertWindow(TheWindow);
  432. end;
  433.  
  434. procedure TTutorApp.OpenOrderWindow;
  435. begin
  436.   if Message(Desktop, evBroadcast, cmFindOrderWindow, nil) = nil then
  437.   begin
  438.     OrderWindow := New(POrderWindow, Init);
  439.     InsertWindow(OrderWindow);
  440.   end
  441.   else
  442.     if PView(OrderWindow) <> Desktop^.TopView then OrderWindow^.Select;
  443.   ShowOrder(0);
  444. end;
  445.  
  446. procedure TTutorApp.OpenWindow;
  447. var
  448.   R: TRect;
  449.   FileDialog: PFileDialog;
  450.   TheFile: FNameStr;
  451. const
  452.   FDOptions: Word = fdOKButton or fdOpenButton;
  453. begin
  454.   TheFile := '*.*';
  455.   New(FileDialog, Init(TheFile, 'Open file', '~F~ile name',
  456.     FDOptions, 1));
  457.   if ExecuteDialog(FileDialog, @TheFile) <> cmCancel then
  458.   begin
  459.     R.Assign(0, 0, 75, 20);
  460.     InsertWindow(New(PEditWindow, Init(R, TheFile, wnNoNumber)));
  461.   end;
  462. end;
  463.  
  464. procedure TTutorApp.SaveDesktop;
  465. var
  466.   DesktopFile: TBufStream;
  467. begin
  468.   Desktop^.Delete(ClipboardWindow);
  469.   DesktopFile.Init('DESKTOP.TUT', stCreate, 1024);
  470.   DesktopFile.Put(Desktop);
  471.   DesktopFile.Done;
  472.   InsertWindow(ClipboardWindow);
  473. end;
  474.  
  475. procedure TTutorApp.SaveOrderData;
  476. begin
  477.   if OrderWindow^.Valid(cmClose) then
  478.   begin
  479.     OrderWindow^.GetData(OrderInfo);
  480.     if CurrentOrder = OrderColl^.Count then
  481.     begin
  482.       TempOrder^.TransferRecord := OrderInfo;
  483.       OrderColl^.Insert(TempOrder);
  484.       OrderWindow^.Counter^.IncCount;
  485.     end
  486.     else POrderObj(OrderColl^.At(CurrentOrder))^.TransferRecord := OrderInfo;
  487.     SaveOrders;
  488.     ShowOrder(CurrentOrder);
  489.   end;
  490. end;
  491.  
  492. procedure TTutorApp.ShowOrder(AOrderNum: Integer);
  493. begin
  494.   CurrentOrder := AOrderNum;
  495.   OrderInfo := POrderObj(OrderColl^.At(CurrentOrder))^.TransferRecord;
  496.   with OrderWindow^ do
  497.   begin
  498.     SetData(OrderInfo);
  499.     Counter^.SetCurrent(CurrentOrder + 1);
  500.   end;
  501.   if CurrentOrder > 0 then EnableCommands([cmOrderPrev])
  502.   else DisableCommands([cmOrderPrev]);
  503.   if OrderColl^.Count > 0 then EnableCommands([cmOrderNext]);
  504.   if CurrentOrder >= OrderColl^.Count - 1 then DisableCommands([cmOrderNext]);
  505.   EnableCommands([cmOrderSave, cmOrderNew]);
  506. end;
  507.  
  508. var
  509.   TutorApp: TTutorApp;
  510.  
  511. begin
  512.   TutorApp.Init;
  513.   TutorApp.Run;
  514.   TutorApp.Done;
  515. end.
  516.